Biasaddgrad ================= 将偏置向量 `input_bias` 加到输入张量 `input_x` 上。这是一个特殊的广播加法,其中偏置向量会沿着非通道维度进行广播。 .. math:: dbias_c = \sum_{n,h,w} dy(n, h, w, c) 其中 :math:`dbias_c` 是偏置梯度向量的第 `c` 个元素,:math:`dy` 是上游梯度张量。 输入: - **dy** - 来自后一层的上游梯度张量。格式必须为 NHWC。 - **dy_dims** - 上游梯度张量 `dy` 的维度信息数组。 - **shape_size** - 上游梯度张量 `dy` 的维度数。 - **core_mask** - 核掩码。 输出: - **dbias** - 输出的偏置梯度向量。其长度等于 `dy` 的通道数。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持fp32 - MT7004 支持fp16, fp32 **共享存储版本:** .. c:function:: void fp_biasaddgrad_s(float* dy, int* dy_dims, int shape_size, float* dbias, int core_mask) .. c:function:: void hp_biasaddgrad_s(half* dy, int* dy_dims, int shape_size, half* dbias, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 14 //FT78NE示例 #include #include int main(int argc, char* argv[]) { float *dy = (float *)0xA0000000; // dy 在DDR空间 float *dbias = (float *)0xB0000000; // dbias output // NHWC format int dy_dims[] = {2, 16, 16, 8}; // N, H, W, C int shape_size = 4; int core_mask = 0xff; // The length of dbias should be dy_dims, which is 8. fp_biasaddgrad_s(dy, dy_dims, shape_size, dbias, core_mask); return 0; } **私有存储版本:** .. c:function:: void fp_biasaddgrad_p(float* dy, int* dy_dims, int shape_size, float* dbias) .. c:function:: void hp_biasaddgrad_p(half* dy, int* dy_dims, int shape_size, half* dbias) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 13 //FT78NE示例 #include #include int main(int argc, char* argv[]) { float *dy = (float *)0x10000000; // dy 在L2空间 float *dbias = (float *)0x11000000; // dbias output // NHWC format int dy_dims[] = {2, 16, 16, 8}; // N, H, W, C int shape_size = 4; // The length of dbias should be dy_dims, which is 8. fp_biasaddgrad_p(dy, dy_dims, shape_size, dbias); return 0; }